home *** CD-ROM | disk | FTP | other *** search
- #include <stdio.h>
- #include <stdlib.h>
- #include <string.h>
- #include "t_lex.h"
- #include "t_cio.h"
- #include "bstone_m.h"
- #include "bstone_y.h"
-
-
- int yylex(void)
- {
- double dd; int i,n,c,n1,n2;
- T_NODE *tnode;
- char msg[]={"Parsing command line"};
- char *s;
-
- if(transl_flag==1)
- {
- lex=t_lex(NULL,NO_FORCE);
- if(lex==(LEX *)NULL) return(EOF);
- switch(lex->typ)
- {
- case EOLX:
- case EOLN: return(EOF);
- case END: cline[clinep++]=TOKENVAL(END);
- return(Y_END);
- case REM: cline[clinep++]=TOKENVAL(REM);
- return(Y_REM);
- case GOTO: cline[clinep++]=TOKENVAL(GOTO);
- return(Y_GOTO);
- case TRACE: cline[clinep++]=TOKENVAL(TRACE);
- return(Y_TRACE);
- case LET: return(Y_LET);
- case PRINT: cline[clinep++]=TOKENVAL(PRINT);
- return(Y_PRINT);
- case LIST: cline[clinep++]=TOKENVAL(LIST);
- return(Y_LIST);
- case ABS: cline[clinep++]=TOKENVAL(ABS);
- return(Y_ABS);
- case LOAD: cline[clinep++]=TOKENVAL(LOAD);
- return(Y_LOAD);
- case SAVE: cline[clinep++]=TOKENVAL(SAVE);
- return(Y_SAVE);
- case IF: cline[clinep++]=TOKENVAL(IF);
- return(Y_IF);
- case THEN: cline[clinep++]=TOKENVAL(THEN);
- return(Y_THEN);
- case STOP: cline[clinep++]=TOKENVAL(STOP);
- return(Y_STOP);
- case CONT: cline[clinep++]=TOKENVAL(CONT);
- return(Y_CONT);
- case GOSUB: cline[clinep++]=TOKENVAL(GOSUB);
- return(Y_GOSUB);
- case RETURN: cline[clinep++]=TOKENVAL(RETURN);
- return(Y_RETURN);
- case DELETE: cline[clinep++]=TOKENVAL(DELETE);
- return(Y_DELETE);
- case DIM: cline[clinep++]=TOKENVAL(DIM);
- return(Y_DIM);
- case FOR: cline[clinep++]=TOKENVAL(FOR);
- return(Y_FOR);
- case TO: cline[clinep++]=TOKENVAL(TO);
- return(Y_TO);
- case STEP: cline[clinep++]=TOKENVAL(STEP);
- return(Y_STEP);
- case NEXT: cline[clinep++]=TOKENVAL(NEXT);
- return(Y_NEXT);
- case NEW: cline[clinep++]=TOKENVAL(NEW);
- return(Y_NEW);
- case RUN: cline[clinep++]=TOKENVAL(RUN);
- return(Y_RUN);
- case RND: cline[clinep++]=TOKENVAL(RND);
- return(Y_RND);
- case FOPEN: cline[clinep++]=TOKENVAL(FOPEN);
- return(Y_FOPEN);
- case FPRINT: cline[clinep++]=TOKENVAL(FPRINT);
- return(Y_FPRINT);
- case V0: cline[clinep++]=TOKENVAL(V0);
- return(Y_V0);
- case VX: cline[clinep++]=TOKENVAL(VX);
- return(Y_VX);
- case VY: cline[clinep++]=TOKENVAL(VY);
- return(Y_VY);
- case VZ: cline[clinep++]=TOKENVAL(VZ);
- return(Y_VZ);
- case PLANE: cline[clinep++]=TOKENVAL(PLANE);
- return(Y_PLANE);
- case BIT: cline[clinep++]=TOKENVAL(BIT);
- return(Y_BIT);
- case BOUND: cline[clinep++]=TOKENVAL(BOUND);
- return(Y_BOUND);
- case TEX: cline[clinep++]=TOKENVAL(TEX);
- return(Y_TEX);
- case TRANSFORM:
- cline[clinep++]=TOKENVAL(TRANSFORM);
- return(Y_TRANSFORM);
-
- /* functions; permitted are: */
- /* scalar=f(scalar); scalar=f(scalar,scalar); */
- /* obj=f(obj_lst); obj=f(obj,vector) */
- /* obj=f#(obj,vector); */
- /* vector=f(vector,vector); handle other f. separately ! */
- case SIN: case COS: case TAN:
- case ASIN: case ACOS: case ATAN:
- case POW: case EXP: case LOG:
- case SQRT: case ROT: case SCA:
- case SCALE: case ROTATE:case TRANSLATE:
- case CTDS: case ADDOBJ:
- case UNION: case SECT: case DIFF:
- case SQR: case PER:
- fkt_id=lex->typ;
- cline[clinep++]=TOKENVAL(B_FKT);
- cline[clinep++]=TOKENVAL(fkt_id);
- return(Y_FKT);
-
- case PI: dd=M_PI; n=1; n1=B_NUM; n2=Y_NUM;
- sprintf(tmp_line,"_PI");
- if((tnode=t_symtable(tmp_line))==(T_NODE *)NULL)
- t_error(msg,-1);
- goto la_val;
- case ZAHL: dd=(double)(lex->wert.n.i);
- lex->wert.n.r=dd;
- case REAL: dd=lex->wert.n.r;
- sprintf(tmp_line,"_%.8G",dd);
- if((tnode=t_symtable(tmp_line))==(T_NODE *)NULL)
- t_error(msg,-1);
- n=1; n1=B_NUM; n2=Y_NUM;
- goto la_val;
- case BEZEICHNER:
- if((tnode=t_symfind(lex->wert.n.i))==(T_NODE *)NULL)
- t_error(msg,-1);
- dd=0; n=1; n1=B_VAL; n2=Y_VAL;
- goto la_val;
- case BEZ_VEC:
- if((tnode=t_symfind(lex->wert.n.i))==(T_NODE *)NULL)
- t_error(msg,-1);
- dd=0; n=3; n1=B_VEC; n2=Y_VEC;
- goto la_val;
-
- la_val: if(tnode->p==(void *)NULL)
- {
- if((tnode->p=malloc(n*sizeof(double)))
- ==(void *)NULL) t_error(msg,1);
- for(i=0; i<n; i++) *((double *)(tnode->p)+i)=dd;
- tnode->c=n1;
- }
- n=tnode->n;
- cline[clinep++]=TOKENVAL(n1);
- if((long)abs(n)>0XFFFFL) t_error(msg,3);
- sprintf(cline+clinep,"%04.4X",(unsigned short)n); clinep+=4;
- yylval.t=tnode;
- return(n2);
-
- case BEZ_OBJ:
- if((tnode=t_symfind(lex->wert.n.i))==(T_NODE *)NULL)
- t_error(msg,-1);
- if(tnode->p==(void *)NULL)
- {
- tnode->p=(void *)new_obj();
- tnode->c=B_OBJ;
- }
- n=tnode->n;
- cline[clinep++]=TOKENVAL(B_OBJ);
- if((long)abs(n)>0XFFFFL) t_error(msg,3);
- sprintf(cline+clinep,"%04.4X",(unsigned short)n); clinep+=4;
- yylval.p=tnode->p;
- return(Y_OBJ);
-
- case '\"': n=1; tmp_line[0]='\"';
- do
- {
- lex=t_lex(NULL,LEX_RCHAR);
- c=lex->wert.n.i;
- if((lex->typ==EOLX)||((c=='\n')&&(lex->typ!='\\'))||(n>=LSIZE))
- { yyerror("non-terminated string"); return(EOF); }
- if(lex->typ=='\\') /* special char */
- switch(c)
- {
- case '\n': break;
- case 'n': tmp_line[n++]='\n'; break;
- case 't': tmp_line[n++]='\t'; break;
- default: tmp_line[n++]=c; break;
- }
- else tmp_line[n++]=(char)c;
- }
- while(c!='\"');
- tmp_line[n-1]=(char)0;
- if((tnode=t_symtable(tmp_line))==(T_NODE *)NULL)
- t_error(msg,-1);
- n=tnode->n;
- cline[clinep++]=TOKENVAL(B_STR);
- if((long)abs(n)>0XFFFFL) t_error(msg,3);
- sprintf(cline+clinep,"%04.4X",(unsigned short)n); clinep+=4;
- tnode->c=B_STR;
- yylval.t=tnode;
- return(Y_STR);
-
- default: if(lex->typ<256) cline[clinep++]=(char)(lex->typ);
- return(lex->typ);
-
- } /* switch */
- } /* if transl_flag */
- else
- {
- if(clines==(char *)NULL) return(EOF);
- c=(unsigned char)*(clines+(clinep++));
- if(c>=128)
- switch(VALTOKEN(c))
- {
- case END: return(Y_END);
- case REM: return(Y_REM);
- case GOTO: return(Y_GOTO);
- case TRACE: return(Y_TRACE);
- case LET: return(Y_LET);
- case PRINT: return(Y_PRINT);
- case LIST: return(Y_LIST);
- case ABS: return(Y_ABS);
- case LOAD: return(Y_LOAD);
- case SAVE: return(Y_SAVE);
- case IF: return(Y_IF);
- case THEN: return(Y_THEN);
- case STOP: return(Y_STOP);
- case CONT: return(Y_CONT);
- case GOSUB: return(Y_GOSUB);
- case RETURN: return(Y_RETURN);
- case DELETE: return(Y_DELETE);
- case DIM: return(Y_DIM);
- case FOR: return(Y_FOR);
- case TO: return(Y_TO);
- case STEP: return(Y_STEP);
- case NEXT: return(Y_NEXT);
- case NEW: return(Y_NEW);
- case RUN: return(Y_RUN);
- case RND: return(Y_RND);
- case FOPEN: return(Y_FOPEN);
- case FPRINT: return(Y_FPRINT);
- case V0: return(Y_V0);
- case VX: return(Y_VX);
- case VY: return(Y_VY);
- case VZ: return(Y_VZ);
- case PLANE: return(Y_PLANE);
- case BIT: return(Y_BIT);
- case BOUND: return(Y_BOUND);
- case TEX: return(Y_TEX);
- case TRANSFORM: return(Y_TRANSFORM);
- case B_FKT: fkt_id=VALTOKEN((unsigned char)*(clines+(clinep++)));
- return(Y_FKT);
- case B_VAL: n1=Y_VAL; goto la_val2;
- case B_NUM: n1=Y_NUM; goto la_val2;
- case B_VEC: n1=Y_VEC; goto la_val2;
- case B_STR: n1=Y_STR; goto la_val2;
-
- la_val2: s=clines+clinep;
- n=GET4HEX(s); clinep+=4;
- if((tnode=t_symfind(n))==(T_NODE *)NULL)
- t_error(msg,-1);
- yylval.t=tnode;
- return(n1);
-
- case B_OBJ: s=clines+clinep;
- n=GET4HEX(s); clinep+=4;
- if((tnode=t_symfind(n))==(T_NODE *)NULL)
- t_error(msg,-1);
- yylval.p=tnode->p;
- return(Y_OBJ);
-
- } /* switch */
- else
- switch(c)
- {
- case 0: return(EOF);
- default: return(c);
- }
- } /* if transl_flag else */
-
- return(EOF);
- }
-
-